/**
 特点：元素无序，不重复
 ES6 的set就是集合类
 下面使用object实现集合

 方法：
 add(value):添加一个新元素到集合
 remove(value):从集合删除一个值
 has(value):如果集合包含该值，则返回true否则返回false
 clear():移除集合中所有的元素
 size():返回集合包含元素的个数
 values():返回一个包含集合元素中所有值的数组

 集合间的操作:
 union(set):并集合
 */

class SetObject{
    constructor(){
        this.items = {}
    }

    add(value){
        if(this.has(value)){
            return false
        }
        this.items[value] = value
        return true
    }

    has(value){
       return this.items.hasOwnProperty(value)
    }

    remove(value){
        if(!this.has(value)){
            return false
        }
        delete this.items[value]
        return true
    }

    clear(){
        this.items = {}
    }

    size(){
        return Object.keys(this.items).length
    }

    values(){
        return Object.keys(this.items)
    }

    //集合间的操作-并集
    union(set){
        let temp = new SetObject()
        let values = this.values()
        for(let i=0;i<values.length;i++){
            temp.add(values[i])
        }
        values = set.values()
        for(let i=0;i<values.length;i++){
            temp.add(values[i])
        }
        return temp
    }

    //交集
    intersection(set){
        let temp = new SetObject()
        let values = this.values()
        for(let i=0;i<values.length;i++){
            let item = values[i]
            if(set.has(item)){
                temp.add(item)
            }
        }
        return temp
    }

    //差集
    defference(set){
        let temp = new SetObject()
        let values = this.values()
        for(let i=0;i<values.length;i++){
            let item = values[i]
            if(!set.has(item)){
                temp.add(item)
            }
        }
        return temp
    }

    //子集
    subset(set){

        let values = set.values()
        for(let i=0;i<values.length;i++){
            let item = values[i]
            if(!this.has(item)){
               return false
            }
        }
        return true
    }
}

const set = new SetObject()
const set2 = new SetObject()

console.log('set A',set.add('A'))
console.log('set A',set.add('A'))
console.log('set B',set.add('B'))
console.log('set B',set.add('C'))
console.log('set B',set.add('D'))




console.log(set.values())
console.log(set.size())
console.log('has A',set.has('A'))
console.log('has H',set.has('H'))

console.log('remove 2 ',set.remove('2'))

console.log('--------------------------------')
set2.add('A')
set2.add('B')
set2.add('1')
set2.add('2')
set2.add('3')

console.log('并集')
let union = set.union(set2)
console.log(union.values());

console.log('-------------2-------------------')
console.log('交集')
let intersection = set.intersection(set2)
console.log(intersection.values())

console.log('-------------3-------------------')
console.log('差集')
let deffer =  set.defference(set2)
console.log(deffer.values());


console.log('-------------3-------------------')
console.log('子集')
const set3 = new SetObject()
const set4 = new SetObject()
set3.add('A')
set3.add('B')
set4.add('AAA')
let subset = set2.subset(set3)

console.log("set3 shi set2 的子集：",subset)
subset = set2.subset(set4)
console.log("set4 shi set2 的子集：",subset)

